/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package List;

import Collection接口.Person;
import org.junit.Test;

import java.util.*;

/**
 * @description List接口
 *          |----Collection接口：单列集合一个一个的对象
 *                    |----List接口：储存有序，可重复的数据 -->“动态”数组
 *                          |----ArrayList List主要实现类 效率高 线程不安全 ;底层使用Object[] elementData数组(顺序表)
 *                                         查找、修改效率高
 *                          |----LinkList  对于频繁的插入、删除效率更高          底层使用双向链表
 *                          |----Vector    古老的实现类 效率低 线程安全 ;底层使用Object[] elementData数组
 *
 *                        三个实现类的异同
 *          都实现List接口 储存的数据有序可重复
 *
 *          常用方法
 *           List除了从Collection集合继承的方法外，List 集合里添加了一些根据索引来
 *              操作集合元素的方法。
 *      void add(int index, Object ele):在index位置插入ele元素
 *      boolean addAll(int index, Collection eles):从index位置开始将eles中
 *          的所有元素添加进来
 *      Object get(int index):获取指定index位置的元素
 *      int indexOf(Object obj):返回obj在集合中首次出现的位置
 *      int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
 *      Object remove(int index):移除指定index位置的元素，并返回此元素
 *      Object set(int index, Object ele):设置指定index位置的元素为ele
 *      List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex
 *          位置的子集合
 *
 *      总结
 *      增 add
 *      删 remove 根据索引或者元素 默认使用索引
 *      改 set
 *      查 get
 *      插 add 根据索引加元素
 *      长度 size
 *      遍历 Iterator迭代
 *          foreach
 *          普通for
 *
 *
 *
 * @author 俊昭
 * @date 2022/4/19
*/
public class ListTest {
    /**
     * @description 遍历
     * @author 俊昭
     * @date 2022/4/19
    */
    @Test
    public void test1(){
        List l1 = new ArrayList();
        l1.add("abc");
        l1.add(123);
        l1.add(123);
        l1.add(new Person("ZhangSan",18));
        l1.add(true);

        for (Object o : l1) {
            System.out.println(o);
        }
        Iterator iterator = l1.iterator();

//        while (iterator.hasNext()){
//            System.out.println(iterator.next());
//        }

        for (int i = 0; i < l1.size(); i++) {
            System.out.println(iterator.next());
        }


    }
    @Test
    public void test(){
        // 多态new一个对象 并add些元素
        List l1 = new ArrayList();
        l1.add("abc");
        l1.add(123);
        l1.add(123);
        l1.add(new Person("ZhangSan",18));
        l1.add(true);
        System.out.println(l1);// [abc, 123, 123, Person{name='ZhangSan', age=18}, true]

        // void add(int index, Object ele):在index位置插入ele元素
        l1.add(2,false);
        System.out.println(l1);//[abc, 123, false, 123, Person{name='ZhangSan', age=18}, true]

        // int indexOf(Object obj) 返回obj在集合中首次出现的位置
        System.out.println(l1.indexOf(123));// 1 找到了 index为1
        System.out.println(l1.indexOf(456));// -1 没找到

        // int lastIndexOf(Object obj) 返回obj在当前集合中末次出现的位置
        System.out.println(l1.lastIndexOf(123));// 3 找到了index为3
        System.out.println(l1.lastIndexOf(456));// -1 没找到

        // Object get(int index) 获取指定index位置的元素
        System.out.println(l1.get(4));// Person{name='ZhangSan', age=18}
        System.out.println(l1.get(2));// false

        // Object set(int index, Object ele) 设置指定index位置的元素为ele
        l1.set(4,"ZhangSan");
        System.out.println(l1);// [abc, 123, false, 123, ZhangSan, true]

        // List subList(int fromIndex, int toIndex) 返回从fromIndex到toIndex 左开右闭
        List l2 = l1.subList(2,5);
        System.out.println(l2);// [false, 123, ZhangSan]

        // Object remove(int index) 移除指定index位置的元素，并返回此元素
        System.out.println(l2.remove(2));// ZhangSan
        System.out.println(l2);// [false, 123]

        // boolean addAll(int index, Collection eles)从index位置开始将eles中的所有元素添加进来
        // 如果此列表因调用而更改，则返回true
        System.out.println(l1);// [abc, 123, false, 123, true]
        System.out.println(l1.addAll(2, l2));// true 如果被修改了就返回true
        System.out.println(l1.addAll(2, new ArrayList()));// false "添加"了一个空的集合就返回false
        System.out.println(l1);// [abc, 123, false, 123, false, 123, true]


    }
}
